perm filename WINT1.SAI[VIS,HPM]2 blob sn#112697 filedate 1974-07-25 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "WINTER"
C00006 00003	POS[1,1]←-1.1 POS[2,1]←-1.1 POS[1,2]←-1.1 POS[2,2]←.1 NP←2
C00011 00004	 COMMENT FIND HORIZON
C00016 ENDMK
C⊗;
BEGIN "WINTER"
REQUIRE "WINNIC.SAI[VIS,HPM]" SOURCE_FILE;

INTEGER ARRAY CHAN[0:5],FEAT[1:3,1:4,1:200],PICSZ[1:4];
INTEGER DX1,DY1,DX2,DY2,SCANS,SCANX,SCANY,ERRX,ERRY,H,BST,T,BSTBST;
INTEGER WINDOW,I,J,MAC,NP,PC,NF,CORWIN;
REAL SUM,TX,TY,T0,X,Y,XU,YU,TXP,TYP,FIELD;
STRING ARRAY FILN[1:4],TAIL[1:4];
REAL ARRAY POS[1:2,1:4];
STRING DISP;
REAL X1H,Y1H,Z1H,X2H,Y2H,Z2H,D,TH0,X1,X2,R,XC,ZC;
REAL TH1,TH2,D1,D2,Y1,Z1,Y2,Z2,TT;

PROCEDURE FLUSH(INTEGER F,PIC); COMMENT FORGET A FEATURE;
 BEGIN REAL X,Y,XU,YU;
 X←(FEAT[1,PIC,F]-1)/PICWID+POS[1,PIC]; XU←X+TXP;
 Y←(FEAT[2,PIC,F]-1)/PICHIG+POS[2,PIC]; YU←Y+TYP;
 DRKEN;
 LINE(X,Y,XU,Y);
 LINE(XU,Y,XU,YU);
 LINE(XU,YU,X,YU);
 LINE(X,YU,X,Y);
 TXTPOS(X-.02,Y+.04,.02,-.04); TEXT((F MOD 26)+'100);
 LITEN;
 END;

PROCEDURE SHOW(INTEGER F,PIC); COMMENT DISPLAY A FEATURE;
 BEGIN REAL X,Y,XU,YU;
 X←(FEAT[1,PIC,F]-1)/PICWID+POS[1,PIC]; XU←X+TXP;
 Y←(FEAT[2,PIC,F]-1)/PICHIG+POS[2,PIC]; YU←Y+TYP;
 LITEN;
 LINE(X,Y,XU,Y);
 LINE(XU,Y,XU,YU);
 LINE(XU,YU,X,YU);
 LINE(X,YU,X,Y);
 TXTPOS(X-.02,Y+.04,.02,-.04); TEXT((F MOD 26)+'100);
 END;

STRING PROCEDURE HORSOL;
 BEGIN
 X1←X2←X1H←X2H←FIELD;
 D←1; COMMENT USE CART TRAVEL AS UNIT OF DISTANCE;
 Y1H←-(FEAT[2,1,H]+WINDOW/2)+PICWID/2;
 Z1H←FEAT[1,1,H]-PICWID/2+WINDOW/2;
 Y2H←-(FEAT[2,2,H]+WINDOW/2)+PICWID/2;
 Z2H←FEAT[1,2,H]-PICWID/2+WINDOW/2;
 TH0←ATAN2(Z2H,X2H)-ATAN2(Z1H,X1H);
 R←D/TH0;
 XC←R*SIN(TH0);
 ZC←R*(1-COS(TH0));
 SETFORMAT(0,1);
 RETURN(CVF(TH0*180/3.14159)&"'  ("&CVF(XC)&","&CVF(ZC)&")");
 END;

STRING PROCEDURE CAMSOL(INTEGER I);
 BEGIN
 Y1←-(FEAT[2,1,I]+WINDOW/2)+PICWID/2;
 Z1←FEAT[1,1,I]-PICWID/2+WINDOW/2;

 Y2←-(FEAT[2,2,I]+WINDOW/2)+PICWID/2;
 Z2←FEAT[1,2,I]-PICWID/2+WINDOW/2;

 TH1←ATAN2(Z1,X1);
 TH2←ATAN2(Z2,X2)-TH0;
 TT←COS(TH2)*SIN(TH1)-SIN(TH2)*COS(TH1);
 D2←(ZC*COS(TH1)-XC*SIN(TH1))/TT;
 IF ABS(TT)<.001 ∨ ABS(D2)>200 THEN RETURN(" INFINITY'");
 D1←(ZC+D2*SIN(TH2))/SIN(TH1);
 IF ABS(TH1)<1/20 THEN RETURN(" TOO NEAR CENTER") ELSE
 IF D1>0∧D2>0∧D1>D2  THEN RETURN(CVF(D1)&"/"&CVF(D2)) ELSE
  IF D1<-90∨D2<-90 THEN RETURN(" INFINITY""") ELSE RETURN("   ?");
 END;

POS[1,1]←-1.1; POS[2,1]←-1.1; POS[1,2]←-1.1; POS[2,2]←.1; NP←2;
CHAN[0]←'32; CHAN[1]←'37; CHAN[2]←'33; CHAN[3]←'34; CHAN[4]←'35; CHAN[5]←'36;
FOR I←0 STEP 1 UNTIL 5 DO GDDCHN(CHAN[I]);
DDINIT; SCREEN(-1.33,1.4,1.2,-1.4);
DRKEN; RECTAN(-2,2,2,-2);

DO
FOR PC←1 STEP 1 UNTIL NP DO
 BEGIN
 DO OUTSTR("FILE "&CVS(PC)&":") UNTIL
 	PIXDIM((FILN[PC]←INCHWL)&
		(TAIL[PC]←(IF FILN[PC][∞ TO ∞]="]" THEN "" ELSE ".TMP[DAT,BGB]")));
 PICSZ[PC]←PICSIZ;
 END UNTIL PICSZ[1]=PICSZ[2];

OUTSTR("FIELD OF VIEW (DEGREES):"); FIELD←3.1415926*CVD(INCHWL)/360;
				FIELD←0.5*PICWID*COS(FIELD)/SIN(FIELD);
OUTSTR("FEATURE WINDOW SIZE:"); WINDOW←CVD(INCHWL); INIWIN(2*WINDOW);
OUTSTR("CORRELATION WINDOW SIZE:"); CORWIN←CVD(INCHWL);
OUTSTR("DISPLAY?"); DISP←INCHWL;

 BEGIN
 INTEGER ARRAY PIC[1:NP,1:PICSIZ];
 TX←WINDOW/PICWID; TXP←(WINDOW-1)/PICWID;
 TY←WINDOW/PICHIG; TYP←(WINDOW-1)/PICHIG;

 T0←0;
 FOR PC←1 STEP 1 UNTIL NP DO
  BEGIN INTEGER ARRAY TEMPIC[1:PICSIZ];
  PIXDIM(FILN[PC]&TAIL[PC]);
  GETPIX(TEMPIC[1]);
  T←CALL(0,"RUNTIM");
  CLEAN(TEMPIC[1]); PASSHI(TEMPIC[1],PIC[PC,1]);
  T0←T0+CALL(0,"RUNTIM")-T;
  END;
 SETFORMAT(0,1);
 OUTSTR('15&'12&"PREPROCESSING TIME -"&CVF(T0/1000)&" SECS"&'15&'12);

 INIWIN(WINDOW);

  BEGIN
  INTEGER ARRAY WINS[-1:VERWIN,1:HORWIN];

  IF DISP LAND '137 ="Y" THEN
   BEGIN
   FOR I←1 STEP 1 UNTIL 5 DO DPYUP('36);

   FOR PC←1 STEP 1 UNTIL NP DO
    BEGIN
    LITEN; TXTPOS(POS[1,PC],POS[2,PC]+1.2,.04,-.08); TEXT(FILN[PC]); DRKEN;
    END;

   FOR I←4 STEP -1 UNTIL (5-PICBIT) MAX 0 DO
    BEGIN
    FOR PC←1 STEP 1 UNTIL NP DO
     BEGIN
     RECTAN(POS[1,PC],POS[2,PC],POS[1,PC]+1,POS[2,PC]+1);
     VIDEO(POS[1,PC],POS[2,PC],POS[1,PC]+1,POS[2,PC]+1,PIC[PC,1],2↑(PICBIT+I-5));
     END;
    FOR J←1 STEP 1 UNTIL 5 DO DPYUP(CHAN[I]);
    END;
   END;

  RECTAN(-2,2,2,-2); LITEN;
  FOR J←0 STEP 1 UNTIL HORWIN DO
   BEGIN
   X←J*TX+POS[1,1];
   LINE(X,POS[2,1],X,POS[2,1]-.02);
   LINE(X,POS[2,1]+1,X,POS[2,1]+1.02);
   END;
  FOR I←0 STEP 1 UNTIL VERWIN DO
   BEGIN
   Y←I*TY+POS[2,1];
   LINE(POS[1,1],Y,POS[1,1]-.02,Y);
   LINE(POS[1,1]+1,Y,POS[1,1]+1.02,Y);
   END;

  DPYUP(CHAN[5]);
  SETFORMAT(0,1);
  T0←CALL(0,"RUNTIM"); SUM←DOWIN(PIC[1,1],WINS[1,1]); 
  OUTSTR("INTEREST OPERATOR TIME -"&CVF((CALL(0,"RUNTIM")-T0)/1000)&" SECS"&'15&'12);

  NF←0;
  FOR I←2 STEP 1 UNTIL VERWIN-3 DO
  FOR J←3 STEP 1 UNTIL HORWIN-2 DO
   BEGIN  INTEGER II,JJ,WMAX;
   X←(J-1)*TX+POS[1,1];
   Y←(I-1)*TY+POS[2,1];
   IF (WINS[I,J] LAND 1)=0 ∧ WINS[I,J]≥SUM THEN
    BEGIN
    FEAT[1,1,NF←NF+1]←(J-1)*WINDOW+1;
    FEAT[2,1,NF]←(I-1)*WINDOW+1;
    FEAT[3,1,NF]←WINS[I,J];
    SHOW(NF,1);
    DPYUP(CHAN[5]);
    END;
   END;

  FOR I←1 STEP 1 UNTIL 5 DO DPYUP(CHAN[5]);
 COMMENT FIND HORIZON;
 WINDOW←CORWIN;
 INIWIN(WINDOW);
 TX←WINDOW/PICWID;
 TY←WINDOW/PICHIG;
 BSTBST←'377777000000;
  DO
   BEGIN
   H←1; BST←0;
   FOR I←1 STEP 1 UNTIL NF%2 DO
   IF FEAT[3,1,I]>BST ∧ FEAT[3,1,I]<BSTBST ∧
      FEAT[1,1,I]≥PICWID/3 ∧ FEAT[1,1,I]≤2*PICWID/3 THEN
	 BEGIN H←I; BST←FEAT[3,1,I]; END;
   BSTBST←BST;
   SCANY←10; SCANX←60;
   DX1←1 MAX (FEAT[1,1,H]-SCANX);
   DY1←1 MAX (FEAT[2,1,H]-SCANY);
   DX2←PICWID MIN (FEAT[1,1,H]+SCANX+WINDOW-1);
   DY2←PICHIG MIN (FEAT[2,1,H]+SCANY+WINDOW-1);
   T0←CALL(0,"RUNTIM");
   T←BSTCOR(PIC[1,1],FEAT[1,1,H],FEAT[2,1,H],FEAT[1,1,H]+WINDOW-1,
		 FEAT[2,1,H]+WINDOW-1,PIC[2,1],DX1,DY1,DX2,DY2);
   FEAT[1,2,H]←DX1; FEAT[2,2,H]←DY1; FEAT[3,2,H]←T;
   END UNTIL T≤8∨BST=0;
  OUTSTR("HORIZON SEARCH TIME -"&CVF((CALL(0,"RUNTIM")-T0)/1000)&" SECS"&'15&'12);
  IF BST=0 THEN
   BEGIN
   TXTPOS(.05,H*.08-1,.05,-.07);
   TEXT("HORIZON NOT FOUND");
   FOR J←1,2,3 DO DPYUP(CHAN[5]);
   OUTSTR("COULDN'T LOCATE HORIZON"&'15&'12);
   END
  ELSE
   BEGIN
   SHOW(H,2);
   FOR J←1,2 DO
    BEGIN
    X←(FEAT[1,J,H]-FEAT[1,1,H])/PICWID+POS[1,J]+.5;
    Y←(FEAT[2,J,H]-FEAT[2,1,H])/PICHIG+POS[2,J]+.5;
    YU←POS[2,J]; XU←POS[1,J];
    LINE(X,YU,X,YU+1); LINE(XU,Y,XU+1,Y);
    END;
   TXTPOS(.05,H*.08-1,.05,-.07);
   TEXT(((H MOD 26)+'100)&"-");
   TXTPOS(.175,H*.08-1.01,.03,-.06);
   TEXT("(HORIZ) "&HORSOL);
   FOR J←1,2,3 DO DPYUP(CHAN[5]);
   ERRX←DX1-FEAT[1,1,H]; ERRY←DY1-FEAT[2,1,H];

  COMMENT NOW FIND OTHER FEATURES;
  T0←0;
   FOR I←1 STEP 1 UNTIL NF DO IF I≠H THEN
    BEGIN 
    SCANX←15; SCANY←15;
    DX1←1 MAX (FEAT[1,1,I]+ERRX-SCANX);
    DY1←1 MAX (FEAT[2,1,I]+ERRY-SCANY);
    DX2←PICWID MIN (FEAT[1,1,I]+ERRX+SCANX+WINDOW);
    DY2←PICHIG MIN (FEAT[2,1,I]+ERRY+SCANY+WINDOW);
    T0←T0-CALL(0,"RUNTIM");
    T←BSTCOR(PIC[1,1],FEAT[1,1,I],FEAT[2,1,I],FEAT[1,1,I]+WINDOW-1,
		 FEAT[2,1,I]+WINDOW-1,PIC[2,1],DX1,DY1,DX2,DY2);
    T0←T0+CALL(0,"RUNTIM");
    FEAT[1,2,I]←DX1; FEAT[2,2,I]←DY1; FEAT[3,2,I]←T;
    SHOW(I,2);
    TXTPOS(.05,I*.08-1,.05,-.07); TEXT(('100+(I MOD 26))&"-");
    TXTPOS(.175,I*.08-1.01,.03,-.06);
    IF T≤11 THEN TEXT(CAMSOL(I)) ELSE FOR J←1,2 DO FLUSH(I,J);
    FOR J←1,2,3 DO DPYUP(CHAN[5]);
    END;
   OUTSTR("FEATURE SEARCH TIME -"&CVF(T0/1000)&" SECS   ");
   OUTSTR("(PER FEATURE"&CVF(T0/(1000*(NF-1)))&" SECS)"&'15&'12);

   FOR I←1,2,3 DO DPYUP(CHAN[5]);
   END;

  MAKPIX(VERWIN,HORWIN,6);
   BEGIN
   INTEGER ARRAY POUT[1:PICSIZ];
   FOR I←1 STEP 1 UNTIL VERWIN DO FOR J←1 STEP 1 UNTIL HORWIN
			 DO PUTEL(POUT[1],I,J,63*SQRT(WINS[I,J]/MAC));
   PUTPIX(POUT[1],"TMP.TMP");
   END;

  END;
 END;
END;